<!DOCTYPE html>
<html lang="en">
<head>
  <meta charset="UTF-8">
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
  <title>继承</title>
</head>
<body>
  <script>
    //1、原型链继承
    //定义一个父类
    function Father(name){
      this.name=name;
    }
    Father.prototype.age=10;

    //优点：实例可以继承的属性：1、实例构造函数的属性2、父类构造函数的属性 3、父类的属性
    //缺点：1、继承单一 2、新实例无法向父类构造函数传参 3、所有新实例都会共享父类实例的属性。（原型上的属性是共享的，一个实例修改了原型属性，另一个实例的原型属性也会被修改！）

   //2、构造函数继承
   function Father1(name){
     this.name=name;
   }
   function Fathers(sex){
     this.sex=sex;
   }
   Father1.prototype.age=10;
   function Son1(name,sex){
     Father1.call(this,"pxl");
     this.name=name||"pxl";
     this.sex=sex||"女"
   }
   var son1=new Son1();
   console.log(son1.name,son1.age,son1.sex)
   //优点：1、只继承了父类构造函数的属性，并没有继承父类实例原型的属性
   //2、可以继承多个构造函数属性
   //3、子类实例无法向父类传参

   //3、组合继承（构造函数和原型链继承组合）
    function Father2(name){
      this.name=name;
    }
    Father2.prototype.age=10;
    function Son2(name){
      Father2.call(this);
      this.name=name||"zyl";
    }
    Son2.prototype=new Father2();
    var son2=new Son2();
    console.log(son2.name,son2.age)  //zyl 10
   //子类实例可以继承父类原型的属性

   //4、原型式继承
  function Father3(name){
    this.name=name;
  }
  Father3.prototype.age=11;
  function Content(name){
    var instance=new Father3();
    instance.name=name||"zzw";
    return instance;
  }
  var son3=new Content();
  console.log(son3.name,son3.age)  //zzw 11

  //寄生组合式继承
  function Father4(name,age){
    this.name=name||"zzj";
    this.age=age||15
  }
  Father4.prototype.sex="女"
  function Son4(name,age){
    Father4.call(this,name,age)
  }
  (function(){
    var Fathers=function(){};
    Fathers.prototype=Father4.prototype;
    Son4.prototype=new Fathers()
  })()
  Son4.prototype.constructor=Son4;
  var son4=new Son4();
  console.log(son4.name,son4.age,son4.sex) //zzj 15 女


  </script>
</body>
</html>